package club.pinea.mapper;

import club.pinea.model.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * @author pineapple
 * @date 2017年12月21日 下午3:04:03
 * @description 用户操作类接口
 */
@Mapper
public interface UserMapper {

    /**
     * 根据用户名查询user对象
     *
     * @param name 查询的条件用户名
     * @return 查询到的user对像
     */
    User selectUserByName(@Param(value = "name") String name);

    /**
     * 更新IP地址并改变用户的状态
     *
     * @param id 根据ID检索用户
     * @param ip 需要修改的用户的IP地址
     */
    int updateUserIp(@Param(value = "id") Integer id, @Param(value = "ip") String ip, @Param(value = "staySeatTime") int staySeatTime);

    /**
     * 用户注册的方法
     *
     * @param u 封装的用户对象
     * @return
     */
    int userRegister(User u);

    /**
     * 查找邀请人是否存在
     *
     * @param beInvited 用户id，邀请码
     */
    int userCount(String beInvited);

    /**
     * 用户信息添加
     *
     * @param u
     * @return
     */
    int userInfoRegister(User u);

    /**
     * 检验用户名是否存在
     *
     * @param name
     * @return
     */
    int verifyName(@Param(value = "username") String name);


    /**
     * 更新留机次数
     *
     * @param time 次数
     * @param id   用户id
     */
    void updateStaySeatTime(@Param(value = "time") int time, @Param(value = "id") int id);

    /**
     * 验证更改IP地址状态
     *
     * @param
     * @return
     */
    int adminValidate();

    /**
     * 更新修改服务器IP的状态
     *
     * @param i
     */
    void updateControllerValue(@Param(value = "status") int i);

    /**
     * 根据推广员用户名查询
     *
     * @param name
     * @return
     */
    Promoter selectPromoterByName(@Param(value = "name") String name);

    /**
     * 更新user信息
     *
     * @param u
     * @return
     */
    int updateUserById(User u);


    /**
     * 更新用户金币
     *
     * @param d
     * @return
     */
    int updateMoney(@Param(value = "money") double d, @Param(value = "id") int id);

    /**
     * 通过id查询用户名
     *
     * @param userId
     * @return
     */
    String getUserNameById(@Param(value = "id") int userId);

    /**
     * 更新用户校验id
     *
     * @param checkId
     * @return
     */
    int updateCheckId(@Param(value = "checkId") int checkId, @Param(value = "id") int id, @Param(value = "score") int score);

    /**
     * 获取座位信息
     *
     * @param seatId
     * @param seatId
     * @return
     */
    SeatsInfo getSeatsInfo(@Param(value = "id") int seatId);

    /**
     * 根据用户id获取用户信息
     *
     * @param userId
     * @return
     */
    UserInfo getUserInfo(@Param(value = "userId") int userId);

    /**
     * 根据用户id查询用户对象
     *
     * @param userId
     * @return
     */
    User getUserById(@Param(value = "userId") int userId);

    /**
     * 更新用户游戏信息
     *
     * @param score
     * @param gameScore
     */
    int updateUserInfo(@Param(value = "payScore") int score, @Param(value = "gotScore") int gameScore, @Param(value = "userId") int id);

    /**
     * 更新座位游戏信息
     *
     * @param score
     * @param gameScore
     * @param seatId
     * @return
     */
    int updateSeatInfo(@Param(value = "payScore") int score, @Param(value = "gotScore") int gameScore, @Param(value = "id") int seatId);

    /**
     * 更新座位信息中的座位集合值
     *
     * @param b
     * @param seatId
     * @param seatId
     * @return
     */
    int updateSeatListNum(@Param(value = "num") int b, @Param(value = "id") int seatId, @Param(value = "payScore") int score, @Param(value = "resetNum") int resetNum);

    /**
     * 更新座位信息的比倍信息
     *
     * @param score
     * @param gameScore
     * @param seatId
     * @return
     */
    int updateSeatDoubleScore(@Param(value = "payScore") int score, @Param(value = "gotScore") int gameScore, @Param(value = "id") int seatId);

    /**
     * 查询座位的游戏记录信息
     *
     * @param seatId
     * @return
     */
    Map<String, Object> selectSeatRecords(@Param(value = "seatId") int seatId);

    /**
     * 添加游戏记录
     *
     * @param userId
     * @param seatId
     * @param i
     * @param gameScore
     * @param result
     * @param j
     * @param multiplyPower
     */
    void addRecords(@Param(value = "userId") int userId, @Param(value = "seatId") Integer seatId, @Param(value = "isDouble") int i,
                    @Param(value = "payScore") int gameScore, @Param(value = "double") int result, @Param(value = "gotScore") int j, @Param(value = "roomDouble") int multiplyPower);

    double selectUserMoneyById(@Param(value = "id") int id);


    /**
     * 用户退出登录
     *
     * @param id 检索用户对象的ID
     * @return 返回受影响的行数
     */
    int userLoginout(@Param(value = "id") Integer id, @Param(value = "status") int status);

    /**
     * 根据ID查找用户名
     *
     * @param id
     * @return
     */
    String getUserName(@Param(value = "id") Integer id);

    /**
     * 根据用户ID查询用户金币余额
     *
     * @param userId
     * @return
     */
    long getMoneyById(@Param(value = "id") int userId);

    /**
     * 将超时的暂离用户状态设置为离线
     */
    void updateTimeOutUser();

    /**
     * 更新超过游戏次数上限的用户信息表数据
     */
    void updateOutBoundsUserInfoGameTime();

    /**
     * 更新超过游戏次数上限的座位信息表数据
     */
    void updateOutBoundsSeatsInfoGameTime();

    /**
     * 根据Id查找user对象
     *
     * @param userId 用户id
     * @return
     */
    User selectUserById(@Param(value = "id") int userId);

    /**
     * 更新用户状态
     *
     * @param status
     * @param id
     */
    void updateUserStatus(@Param(value = "status") int status, @Param(value = "id") int id);


    /**
     * 根据用户名查询user对象
     *
     * @param name 查询的条件用户名
     * @return 查询到的user对像
     */
    Admin selectAdminByName(@Param(value = "name") String name);

    /**
     * 更新IP地址并改变用户的状态
     *
     * @param name 根据ID检索用户
     * @param ip   需要修改的用户的IP地址
     */
    int updateAdminIp(@Param(value = "name") String name, @Param(value = "ip") String ip);

    /**
     * 根据id添加金币
     *
     * @param id    用户id
     * @param money 用户需要添加的金币
     * @return
     */
    int addUserMoney(@Param(value = "id") Integer id, @Param(value = "money") Integer money);

    /**
     * 根据用户id查询金币
     *
     * @param id 用户的id
     * @return 新的金币数量
     */
    double selectUserMoneyById(@Param(value = "id") Integer id);

    /**
     * 退出登录
     */
    int logout(@Param(value = "name") String name);

    /**
     * 将用户封禁
     *
     * @param name
     */
    int closureAdmin(@Param(value = "name") String name);

    /**
     * 根据id返回推广员对象
     *
     * @param id
     * @return
     */
    Promoter selectPromoterById(@Param(value = "id") int id);

    /**
     * 更新推广员密码
     *
     * @param id
     * @param newPass
     */
    int updatePromoterPass(@Param(value = "id") int id, @Param(value = "pass") String newPass);

    /**
     * 减少推广员的余额
     *
     * @param id
     * @param balance
     * @return
     */
    int addPromoterBalance(@Param(value = "id") int id, @Param(value = "balance") int balance);

    /**
     * 添加操作记录
     *
     * @param promId
     * @param add
     * @param reduce
     */
    void addPromoterRecords(@Param(value = "id") int promId, @Param(value = "add") int add, @Param(value = "reduce") int reduce, @Param(value = "by") int by);

    /**
     * 查询金币操作记录集
     *
     * @param promId
     * @param month
     * @return
     */
    List<Map<String, Object>> selectAdminRecords(@Param(value = "id") int promId, @Param(value = "month") int month, @Param(value = "year") int year);

    /**
     * 根据子推广员查询上一级推广员
     *
     * @param promId
     * @return
     */
    Promoter getSupperParentPromoter(@Param(value = "id") String promId);

    /**
     * 添加子级推广员
     *
     * @param prom
     * @return
     */
    int addChildPromoter(Promoter prom);

    /**
     * 查询直属推广员信息
     *
     * @param promId
     * @return
     */
    List<Map<String, Object>> selectClindPromInfo(@Param(value = "id") int promId);

    /**
     * 查询推广员下面的直属会员信息
     *
     * @param promId
     * @return
     */
    List<Map<String, Object>> selectUsersInfo(@Param(value = "id") int promId);

    /**
     * 推广员充值金币
     *
     * @param promId
     * @param money
     * @return
     */
    int addMoneyByAdmin(@Param(value = "id") int promId, @Param(value = "money") int money);

    /**
     * 根据推广员id查询余额
     *
     * @param promId
     * @return
     */
    int selectPromoterBalanceById(@Param(value = "id") int promId);

    /**
     * 推广员查询金币充值记录
     *
     * @param promId
     * @param day
     * @param year
     * @param month
     * @return
     */
    List<Map<String, Object>> selectUserAddRecords(@Param(value = "id") int promId, @Param(value = "day") int day, @Param(value = "month") int month, @Param(value = "year") int year);

    /**
     * 推广员查询金币兑奖记录
     *
     * @param promId
     * @param day
     * @param month
     * @param year
     * @return
     */
    List<Map<String, Object>> selectReduceRecords(@Param(value = "id") int promId, @Param(value = "day") int day, @Param(value = "month") int month, @Param(value = "year") int year);


    /**
     * 每日下分报告
     *
     * @param day
     * @param month
     * @param year
     * @return
     */
    List<Map<String, Object>> selectReduceMoneyByDay(@Param(value = "day") int day, @Param(value = "month") int month, @Param(value = "year") int year);

    /**
     * 每日上分报告查询
     *
     * @param day
     * @param month
     * @param year
     * @return
     */
    List<Map<String, Object>> selectAddMoneyByDay(@Param(value = "day") int day, @Param(value = "month") int month, @Param(value = "year") int year);

    /**
     * 每月营收详情
     *
     * @param month
     * @param year
     * @return
     */
    List<Map<String, Object>> selectMoneyByMonth(@Param(value = "month") int month, @Param(value = "year") int year);

    /**
     * 游戏运营统计
     *
     * @param month
     * @param year
     * @return
     */
    List<Map<String, Object>> selectGameScoreRecords(@Param(value = "month") int month, @Param(value = "year") int year);

    /**
     * 系统日志查询
     *
     * @param day
     * @param month
     * @param year
     * @return
     */
    List<Map<String, Object>> selectSystemLogs(@Param(value = "day") int day, @Param(value = "month") int month, @Param(value = "year") int year);

    /**
     * 更新推广员登录时间
     *
     * @param id
     */
    void updatePromoterLogTime(@Param(value = "id") int id);

    /**
     * 记录系统日志
     *
     * @param str
     * @param id
     */
    void addSystemLog(@Param(value = "log") String str, @Param(value = "id") int id);

    /**
     * 根据id查询推广员名称
     *
     * @param promId
     * @return
     */
    String selectPromNameById(@Param(value = "promId") int promId);

    /**
     * 调节玩家难度
     *
     * @param hard
     * @param userId
     * @return
     */
    int ctrlUserHard(@Param(value = "hard") int hard, @Param(value = "id") int userId);

    /**
     * 调节座位难度
     *
     * @param hard
     * @param seatId
     * @return
     */
    int ctrlSeatIdHard(@Param(value = "hard") int hard, @Param(value = "id") int seatId);

    /**
     * 根据用户名查找id
     *
     * @param userName
     * @return
     */
    int selectUserIdByName(@Param(value = "name") String userName);

    /**
     * 删除所有userInfo表数据
     *
     * @return
     */
    int clearUserInfo();

    /**
     * 删除所有玩家
     *
     * @return
     */
    int clearUsers();

    /**
     * 重置seatsInfo表数据
     *
     * @return
     */
    int clearSeatsInfo();

    int deleteUserInfoTable(int id);

    int deleteUserTable(int id);

    int deleteUserBeInvited(int id);

    /**
     * 查询管理员信息
     *
     * @return
     */
    Admin selectAdminPass();

    int updateAdminInfo(@Param(value = "admin") Admin admin);

    int checkPromoterName(@Param(value = "name") String name);

    List<Promoter> selectAllTopPromoters();

    int deletePromoterByName(@Param(value = "name") String name);

    int deleteAllUsers();

    int deleteAllUserInfo();

    int deleteAllRecords();

    int deleteAllPromoters();

    int deleteAllPromotersRecords();

}
